package com.yungu.swift.admin.route.helper;

import com.yungu.swift.utils.Base64Utils;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Calendar;

/**
 * @author : cuixiuyin
 * @date : 2019/6/4
 */
public class JwtHelper {

    /**
     * 加密密钥
     */
    private static final String JWT_SECERT = "yungulink20190322twdzp";
    /**
     * 过期时间 86400 秒（24小时，保证 jwt 的过期时间远大于 redis 的缓存时间，过期失效尽量由 redis 来控制）
     */
    private static final Integer EXPIRATION = 60 * 60 * 24;

    /**
     * 签发JWT
     *
     * @param id
     * @param info 可以是JSON数据 尽可能少
     * @return String
     */
    public static String createJWT(String id, String info) {
        Calendar calendar = Calendar.getInstance();
        JwtBuilder builder = Jwts.builder()
                //jwt标识
                .setId(id)
                //内容
                .setSubject(info)
                //签发者
                .setIssuer("swift")
                //签发时间
                .setIssuedAt(calendar.getTime())
                // 签名算法以及密匙
                .signWith(SignatureAlgorithm.HS256, generalKey(JWT_SECERT));
        // 过期时间
        calendar.add(Calendar.SECOND, EXPIRATION);
        builder.setExpiration(calendar.getTime());
        return builder.compact();
    }


    private static SecretKey generalKey(String secretKey) {
        byte[] decodeKey = Base64Utils.decode(secretKey);
        return new SecretKeySpec(decodeKey, 0, decodeKey.length, "AES");
    }

    /**
     * 解析JWT字符串
     *
     * @param jwtStr
     * @return
     */
    public static String parseJWT(String jwtStr) {
        return Jwts.parser()
                .setSigningKey(generalKey(JWT_SECERT))
                .parseClaimsJws(jwtStr)
                .getBody()
                .getSubject();
    }

}
